import os
import json
import pandas as pd
import argparse


def parse_readme(file_path):
    """
    解析 README.OpenSource 文件并返回 JSON 数据。

    参数:
    file_path (str): README.OpenSource 文件的路径。

    返回:
    list: 包含开源软件信息的列表。
    """
    with open(file_path, "r") as file:
        return json.load(file)


def scan_directory(directory, exclude_dirs=None):
    """
    扫描指定目录及其子目录中的 README.OpenSource 文件，并提取开源软件信息。

    参数:
    directory (str): 要扫描的目录路径。
    exclude_dirs (list): 要排除的目录列表。

    返回:
    list: 包含开源软件信息的字典列表，每个字典包含 Name、License、Version Number、Upstream URL 和 Path 字段。
    """
    if exclude_dirs is None:
        exclude_dirs = []

    software_set = {}
    for root, dirs, files in os.walk(directory):
        # 检查是否应该排除当前目录
        if any(excluded in root for excluded in exclude_dirs):
            continue

        for file in files:
            if file == "README.OpenSource":
                full_path = os.path.join(root, file)
                relative_path = os.path.relpath(full_path, directory)
                software_info = parse_readme(full_path)
                for software in software_info:
                    key = software["Name"]
                    filtered_software = {
                        "Name": software["Name"],
                        "License": software["License"],
                        "Version Number": software["Version Number"],
                        "Upstream URL": software["Upstream URL"],
                        "Path": relative_path,
                    }
                    software_set[key] = filtered_software
    return list(software_set.values())


def save_to_json(software_list, output_file):
    """
    将开源软件信息保存到 JSON 文件。

    参数:
    software_list (list): 包含开源软件信息的列表。
    output_file (str): 要保存的 JSON 文件路径。
    """
    with open(output_file, "w") as json_file:
        json.dump(software_list, json_file, indent=4)


def save_to_excel(software_list, output_file):
    """
    将开源软件信息保存到 Excel 文件。

    参数:
    software_list (list): 包含开源软件信息的列表。
    output_file (str): 要保存的 Excel 文件路径。
    """
    df = pd.DataFrame(software_list)
    df.to_excel(output_file, index=False)


def main():
    """
    主函数，解析命令行参数并调用相应函数进行开源软件信息的提取和保存。
    """
    parser = argparse.ArgumentParser(
        description="OpenHarmony Open Source Software Management"
    )
    parser.add_argument("project_path", type=str, help="Path to the project directory")
    parser.add_argument(
        "--exclude-interface",
        action="store_true",
        help="Exclude the interface/ directory",
    )
    parser.add_argument(
        "--exclude-device", action="store_true", help="Exclude the device/ directory"
    )
    parser.add_argument(
        "--exclude-prebuilts",
        action="store_true",
        help="Exclude the prebuilts/ directory",
    )
    args = parser.parse_args()

    project_path = args.project_path
    exclude_dirs = []
    if args.exclude_interface:
        exclude_dirs.append("interface")
    if args.exclude_device:
        exclude_dirs.append("device")
    if args.exclude_prebuilts:
        exclude_dirs.append("prebuilts")

    software_list = scan_directory(project_path, exclude_dirs)

    software_list = sorted(software_list, key=lambda x: x["Name"])

    save_to_json(software_list, "software_list.json")
    save_to_excel(software_list, "software_list.xlsx")


if __name__ == "__main__":
    main()
